/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.br.imovel.controller;

import com.br.imovel.ejb.ModuloEJBLocal;
import com.br.imovel.ejb.ProfessorEJBLocal;
import com.br.imovel.model.Modulo;
import com.br.imovel.model.Professor;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

/**
 *
 * @author diego
 */
@ManagedBean(name = "moduloM")
@SessionScoped
public class ModuloMBean implements Serializable {

    @EJB
    private ModuloEJBLocal moduloEJB;
    @EJB
    private ProfessorEJBLocal professorEJB;
    private Modulo entidade;
    private Modulo[] entidadesSelecionadas;
    private DataModel entidades;
    private FacesMessage msg;
    private Logger log;
    private List<SelectItem> listaProfessores;
    private Professor professor;

    public List<SelectItem> getListaProfessores() {
        if (listaProfessores == null) {
            listaProfessores = new ArrayList<SelectItem>();
            listaProfessores.add(new SelectItem(null, ""));
            List<Professor> professores;
            try {
                professores = professorEJB.recuperaTodos();
                for (Professor professor : professores) {
                    listaProfessores.add(new SelectItem(professor.getId(), professor.getNome() + "- [" + professor.getId() + "]"));
                }
            } catch (Exception e) {
                empilhaMensagem(FacesMessage.SEVERITY_ERROR, "Erro eo recuperar lista de professores", null);
                log.error("Erro eo recuperar lista de professores");
                listaProfessores.add(new SelectItem(null, "Erro eo recuperar lista de professores"));
            }

        }
        return listaProfessores;
    }

    public void setListaProfessores(List<SelectItem> listaProfessores) {
        this.listaProfessores = listaProfessores;
    }

    public ModuloMBean() {
        this.entidade = new Modulo();
        this.entidades = null;
        this.entidade.setProfessor(new Professor());
        listaProfessores = null;
        log = Logger.getLogger(ModuloMBean.class);
        BasicConfigurator.configure();
        log.setLevel(Level.ALL);
        log.info("entrou no construtor");

    }

    public Modulo[] getEntidadesSelecionadas() {
        return entidadesSelecionadas;
    }

    public void setEntidadesSelecionadas(Modulo[] entidadesSelecionadas) {
        this.entidadesSelecionadas = entidadesSelecionadas;
    }

    public void log(String mensagem, Level level, Exception e) {
        if (level == Level.FATAL) {
            log.fatal(System.currentTimeMillis() + mensagem, e);
        } else if (level == Level.ERROR) {
            log.error(System.currentTimeMillis() + mensagem, e);
        } else if (level == Level.WARN) {
            log.warn(System.currentTimeMillis() + mensagem, e);
        } else if (level == Level.INFO) {
            log.info(System.currentTimeMillis() + mensagem, e);
        } else if (level == Level.TRACE) {
            log.trace(System.currentTimeMillis() + mensagem, e);
        }

    }

    public Modulo getEntidade() {
        return entidade;
    }

    public void setEntidade(Modulo entidade) {
        this.entidade = entidade;
        log.trace("setEntidade:" + entidade);

    }

    public void setEntidadeDuplicar(Modulo entidade) {
        this.entidade = entidade;
        this.entidade.setId(null);
        log.trace("setEntidadeDuplicar:" + entidade);

    }

    public DataModel getEntidades() {
        log.trace("getEntidades inicio :");
        if (entidades == null) {
            List<Modulo> lista = moduloEJB.recuperaTodos();
            log.trace("getEntidades :" + lista.toArray());
            entidades = new ListDataModel(lista);
        }
        return entidades;
    }

    public void setEntidades(DataModel entidades) {
        this.entidades = entidades;
    }

    public void prepararAdicionarEntidade() {
        this.entidade = new Modulo();

        this.entidade.setProfessor(new Professor());
        log.info("prepara Adicionar entidade :");


    }

    public void prepararDuplicarEntidade() {
        this.entidade.setId(null);


        log.info("prepara Duplicar Entidade :" + entidade);
    }

    public void salvaEntidade(ActionEvent actionEvent) {
        log.info("entrou salvar Entidade :" + entidade);

        if (entidade.getProfessor().getId() != null) {
            try {
                professor = professorEJB.recupera(entidade.getProfessor().getId());
            } catch (Exception e) {
                empilhaMensagem(FacesMessage.SEVERITY_ERROR, "Erro ao recuperar Professor " + entidade.getNome(), null);
                log.error("Erro ao recupera professor:" + e.getMessage());
            }
        }

        if (this.getEntidade() != null) {

            entidade.setProfessor(professor);
            try {
                if (this.getEntidade().getId() == null) {
                    moduloEJB.novo(entidade);
                    empilhaMensagem(FacesMessage.SEVERITY_INFO, "Registro salvo com sucesso " + entidade.getNome(), null);

                } else {
                    empilhaMensagem(FacesMessage.SEVERITY_INFO, "Registro atualizado com sucesso " + entidade.getNome(), null);
                    moduloEJB.atualiza(entidade);
                }

            } catch (Exception e) {
                empilhaMensagem(FacesMessage.SEVERITY_ERROR, "Erro ao salvar registro " + entidade.getNome(), null);
                log.error("Erro ao salvar registro:" + e.getMessage());
            }
            limpaDados();
        }
    }

    public void removerEntidade() {
        log.info("Remover  Entidade :" + entidade);
        moduloEJB.remove(entidade);
        empilhaMensagem(FacesMessage.SEVERITY_INFO, "Registro removido com sucesso " + entidade.getNome(), null);
        limpaDados();
    }

    public void removerEntidadesSelecionadas() {
        log.trace("Remover  Entidades Selecionadas :" + entidadesSelecionadas);
        empilhaMensagem(FacesMessage.SEVERITY_INFO, "Registros removidos  com sucesso, total de  " + this.entidadesSelecionadas.length, null);
        for (Modulo entidadeAtual : entidadesSelecionadas) {
            try {
                moduloEJB.remove(entidadeAtual);
            } catch (Exception e) {
                empilhaMensagem(FacesMessage.SEVERITY_ERROR, "Erro ao remover  registro", null);

            }
        }
        limpaDados();
    }

    private void limpaDados() {
        this.entidades = null;
        this.entidade = new Modulo();
        professor = new Professor();
        this.entidade.setProfessor(professor);
        this.entidadesSelecionadas = null;
        log.trace("Limpar dados das  Entidades :");

    }

    private void empilhaMensagem(FacesMessage.Severity tipoMensagem, String titulo, String mensagem) {
        msg = new FacesMessage(tipoMensagem, titulo, mensagem);
        FacesContext.getCurrentInstance().addMessage(null, this.msg);

    }
}
